\documentclass[a4paper, 12pt]{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian,english]{babel}
\usepackage[pdftex,unicode]{hyperref}
\usepackage[pdftex]{graphicx}
\usepackage{color}

\begin{document}
KOT!. Проект-файл.

Предлагаю обсудить структуру файла-проекта. Любую критику и замечания до того момента, как начать писать код следует писать здесь. Впоследствии этот документ станет спецификацией.

Основные требования, которым должен удоволетворять формат файла - это:
\begin{enumerate}
\item Простота работы с ним. Под этим я подразумиваю не то, что этот файл удобно изменять любым текстовым редактором руками, а то, что его легко обрабатывать средствами .NET. Хороший пример, это сохранять проект-объект (его DOM представление) в XML постредством сериализации.
\item Масштабbруемость формата. То есть он, формат, должен быть таким, что бы при работе с большим проектом, операция работы с файлом не была слабым местом всей системы.
\end{enumerate}

Если в первом пункте XML это хороший выбор, то во втором это пустая трата машинного времени, поэтому предлагаю следующий формат. Пусть проект-файл состоит из блоков. Каждый блок это размер текстового поля и само текстовое поле. Пусть размер текстового поля - это, например, 4 байта, в начале блока, а остальное - это сериализованный объект в XML объект.

Таким образом я определил синтаксис проекта-файла. Осталось придумать семантику. Но уже сейчас можно написать код, для работы с этим форматом файла, например:\\
Имя класса мне не нравиться, есть варианты?\\
\textcolor{red}{1} \textcolor{blue}{class} \textcolor{green}{QuickSerialization} \{\\
Метод сериализует объект класса T obj и дописывает его как блок в конец файла file. Параметризация метода - это что-то типа шаблонов в C++ см generics\\
\textcolor{red}{2} \quad \textcolor{blue}{public} \textcolor{blue}{void} Append<\textcolor{green}{T}>(\textcolor{green}{FileInfo} file, \textcolor{green}{T} obj)\{$\dots$\}\\
Метод десериализует объект из n-того блока файла file и возвращает его
\textcolor{red}{3} \quad \textcolor{blue}{public} \textcolor{green}{T} Get<\textcolor{green}{T}>(\textcolor{green}{FileInfo} file, \textcolor{blue}{int} n)\{$\dots$\}\\
\textcolor{red}{4} \}

По этой спецификации уже можно написать код. Следует заметить то, что в качестве имени файла я передаю не строку, в которой можно написать что угодно, а объект класса FileInfo, это гарантирует, что вместо файла можно получить только null, а для того, что бы проверить существует ли такой файл достаточно вызвать file.Exists(). Такой подход упрощает реализацию класса QuickSerialization. Думаю в дальнейшем следует придерживаться этой стратегии. То есть простараться как можно меньше использовать примитивные типы при в  парамертрах public методов.

Другая особенность кода это то, что я использовал параметризацию возвращаемого значения, а это исключает использование паттерна частный случай, поэтому в случае ошибки остается использовать exception. В иных случаях, следует всегда, повторяю, всегда использовать паттерн частный случай. Если его нельзя использовать, как в этом случае, то кидать исключение, но никогда не возвращать null. 

\LARGE Если чья-то функция будет возвращать null то тот человек угощает всех БА-пивом.
\end{document}
